#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>


//假设环境是x86环境，程序输出的结果是啥？
// 
//int main()
//{
//    int a[5][5];
//
//    int (*p)[4];//p是指向4个整型元素的数组指针
//
//    p = a;
//    
//    printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//    
//    //数组地址是由小到大，由高到低
//    //指针 - 指针 的绝对值的值是两个指针之间的元素的个数
//    //-4
//    //1000000000000000000000000001100 - 原码
//    //1111111111111111111111111110011 - 反码
//    //1111111111111111111111111110100 - 补码
//    //%d打印有符号整型，%p打印地址
//    //FFFFFFFFC
//    return 0;
//}



//#include <stdio.h>
//int main()
//{
//    int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//
//    int* ptr1 = (int*)(&aa + 1);
//
//    int* ptr2 = (int*)(*(aa + 1)); // *(aa + 1) == aa[1]
//    
//    printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
//
//    return 0;
//}

//*(aa + 1) == aa[1]
//&aa[1] 是取出第二行的地址
//sizeof(arr[1])计算的是第二行的地址，因为arr[1]属于是第二行的数组名，sizeof内部单独放了数组名
//指针+1是取决于指针类型的


//
//#include <stdio.h>
//
//int main()
//{
//    char* a[] = { "work","at","alibaba" };
//    char** pa = a;
//    pa++;
//    printf("%s\n", *pa);//at
//    return 0;
//}


//#include <stdio.h>
//int main()
//{
//    char* c[] = { "ENTER","NEW","POINT","FIRST" };//c是一个指针数组，存放着这六个字符串的首字母的地址
//    char** cp[] = { c + 3,c + 2,c + 1,c };
//    char*** cpp = cp;
//
//    printf("%s\n", **++cpp); //POINT
//    printf("%s\n", *-- * ++cpp + 3);//ER
//    printf("%s\n", *cpp[-2] + 3);//ST
//    printf("%s\n", cpp[-1][-1] + 1);//EW
//    //把图画出来就比较方便理解了
//    return 0;
//}


